/*
 * SPDX-FileCopyrightText: 2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test

import android.system.Os
import java.io.FileDescriptor
import java.io.IOException
import java.nio.ByteBuffer

// 这些还不能作为扩展方法：https://github.com/Kotlin/KEEP/issues/348。

/**
 * 将ByteBuffer中的所有数据写入文件描述符
 * @param fd 文件描述符
 * @param buffer 包含待写入数据的ByteBuffer
 * @throws IOException 当写入过程中出现意外EOF时抛出
 */
fun writeFully(fd: FileDescriptor, buffer: ByteBuffer) {
    while (buffer.remaining() > 0) {
        val n = Os.write(fd, buffer)
        // 如果写入字节数为0，表示出现意外的EOF
        if (n == 0) {
            throw IOException("写入数据时出现意外的EOF")
        }
    }
}

/**
 * 将字节数组中的指定部分完全写入文件描述符
 * @param fd 文件描述符
 * @param bytes 包含待写入数据的字节数组
 * @param byteOffset 数据在数组中的起始偏移量
 * @param byteCount 要写入的字节数
 * @throws IOException 当写入过程中出现意外EOF时抛出
 */
fun writeFully(fd: FileDescriptor, bytes: ByteArray, byteOffset: Int, byteCount: Int) {
    var offset = byteOffset
    var remaining = byteCount

    while (remaining > 0) {
        val n = Os.write(fd, bytes, offset, remaining)
        // 如果写入字节数为0，表示出现意外的EOF
        if (n == 0) {
            throw IOException("写入数据时出现意外的EOF")
        }

        offset += n
        remaining -= n
    }
}